SpotifyR adalah package untuk mengambil data dari API Spotify
Contoh data yang tersedia di API Spotify dapat di cek di https://musicaldata.com/
library(spotifyr)
Untuk dapat menggunakan API Spotify, anda diperlukan untuk membuat akun di developer.spotify.com.
Kunjungi https://developer.spotify.com/dashboard/login dan login dengan akun spotify anda, serta buatlah Client ID. Client ID dan Secret ID akan diperlukan untuk meng authorisasi pekerjaan anda dengan SpotifyR
Sys.setenv(SPOTIFY_CLIENT_ID = '0b559c797211429f8d4c16cc2d42bd56') #Ganti dengan Client ID anda
Sys.setenv(SPOTIFY_CLIENT_SECRET = 'd52a0861080248e1b59f466e891efbdb') #Ganti dengan Secret ID anda
access_token <- get_spotify_access_token(client_id = Sys.getenv('SPOTIFY_CLIENT_ID'), client_secret = Sys.getenv('SPOTIFY_CLIENT_SECRET'))
Untuk mendapatkan fitur audio dari artis tertentu, anda cukup menjalankan get_artist_audio_features(‘nama artis’), contohnya
peterpan <- get_artist_audio_features('peterpan')
spotifyr akan mengambil semua data yang berkaitan dengan artis tersebut, untuk melihat variabel apa saja yang diambil oleh spotifyr, dapat dilihat dengan
colnames(peterpan)
## [1] "artist_name" "artist_id"
## [3] "album_id" "album_type"
## [5] "album_images" "album_release_date"
## [7] "album_release_year" "album_release_date_precision"
## [9] "danceability" "energy"
## [11] "key" "loudness"
## [13] "mode" "speechiness"
## [15] "acousticness" "instrumentalness"
## [17] "liveness" "valence"
## [19] "tempo" "track_id"
## [21] "analysis_url" "time_signature"
## [23] "artists" "available_markets"
## [25] "disc_number" "duration_ms"
## [27] "explicit" "track_href"
## [29] "is_local" "track_name"
## [31] "track_preview_url" "track_number"
## [33] "type" "track_uri"
## [35] "external_urls.spotify" "album_name"
## [37] "key_name" "mode_name"
## [39] "key_mode"
Untuk analisa kali ini, hanya akan diambil beberapa kolom, yaitu
track_name = judul lagu album_name = nama album album_release_year = tahun rilis album danceability = seberapa cocok lagu tersebut untuk berdansa [0-1] energy = seberapa enerjik lagu tersebut [0=1] loudness = seberapa kencang lagu tersebut (dalam desibel) speechiness = seberapa besar presensi dari banyaknya kalimat yang diucapkan [0-1], semakin mendekati 1, maka lagu lebih cenderung terdiri atas pelafalan kata dibandingkan suara instrumen accousticness = seberapa akustik lagu tersebut [0-1] liveness = seberapa mungkin bahwa lagu tersebut merupakan rekaman dari siaran langsung [0-1] valence = seberapa positif lagu tersebut terdengar [0-1] tempo = tempo (bpm) duration_ms = durasi lagu (milisekon)
library(tidyverse)
## -- Attaching packages ------------------------------------------------------------------------------ tidyverse 1.2.1 --
## v ggplot2 3.2.1 v purrr 0.3.2
## v tibble 2.1.3 v dplyr 0.8.3
## v tidyr 1.0.0 v stringr 1.4.0
## v readr 1.3.1 v forcats 0.4.0
## -- Conflicts --------------------------------------------------------------------------------- tidyverse_conflicts() --
## x dplyr::filter() masks stats::filter()
## x dplyr::lag() masks stats::lag()
peterpan <- peterpan %>% select(track_name,album_name,album_release_year,danceability,energy,loudness,speechiness,acousticness,instrumentalness,liveness,valence,tempo,duration_ms)
unique(peterpan$album_name)
## [1] "Alexandria (Original Motion Picture Soundtrack)"
## [2] "Sebuah Nama, Sebuah Cerita"
## [3] "Bintang Di Surga"
## [4] "Hari Yang Cerah"
## [5] "Taman Langit"
## [6] "OST. Alexandria"
## [7] "Peterpan Hits Remix"
Sepertinya ada album yang duplikat (Alexandria), akan dipilih album OST. Alexandria (album “Alexandria (Original Motion Picture Soundtrack)” akan di drop)
peterpan<-peterpan%>%filter(album_name != "Alexandria (Original Motion Picture Soundtrack)")
Akan divisualisasikan bagaimana tingkat valence tiap album, menggunakan joyplot / ridgeplot
library(ggjoy)
## Loading required package: ggridges
##
## Attaching package: 'ggridges'
## The following object is masked from 'package:ggplot2':
##
## scale_discrete_manual
## The ggjoy package has been deprecated. Please switch over to the
## ggridges package, which provides the same functionality. Porting
## guidelines can be found here:
## https://github.com/clauswilke/ggjoy/blob/master/README.md
ggplot(peterpan, aes(x = valence, y = album_name,fill=album_name)) +#memvisualisasikan valence berdasarkan album
geom_joy() +
theme_joy() +
theme(legend.position = "none")+
ggtitle("Joyplot of Peterpan's joy distributions", subtitle = "Based on valence pulled from Spotify's Web API with spotifyr")
## Picking joint bandwidth of 0.108
Dapat dilihat bahwa album remix cenderung lebih positif, namun untuk album lainnya cenderung tidak terlalu berbeda
Anda dapat bereksperimen untuk membandingkan komponen audio lainnya, misalnya energy
ggplot(peterpan, aes(x = energy, y = album_name,fill=album_name)) +#memvisualisasikan energy berdasarkan album
geom_joy() +
theme_joy() +
theme(legend.position = "none")+
ggtitle("Joyplot of Peterpan's energy distributions", subtitle = "Based on energy pulled from Spotify's Web API with spotifyr")
## Picking joint bandwidth of 0.0502
Kita juga dapat membuat visualisasi interaktif dari data peterpan dengan menggunakan package plotly
library(plotly)
##
## Attaching package: 'plotly'
## The following object is masked from 'package:ggplot2':
##
## last_plot
## The following object is masked from 'package:stats':
##
## filter
## The following object is masked from 'package:graphics':
##
## layout
density_danceability_peterpan <- ggplot(peterpan, aes(x=danceability, fill=album_name,
text = paste(album_name)))+
geom_density(alpha=0.7, color=NA)+
labs(x="Danceability", y="Density") +
guides(fill=guide_legend(title="Album"))+
theme_minimal()+
ggtitle("Distribution of Danceability Data")
ggplotly(density_danceability_peterpan, tooltip=c("text"))
Visualisasi alternatif adalah dumbbell plot, yang digunakan untuk melihat rentang minimum - maksimum suatu ukuran, akan di visualisasikan rentang tempo tiap album
peterpan_tempo <- peterpan %>%
group_by(album_name)%>% #di grup berdasarkan album
mutate(max=max(tempo))%>% #membuat kolom maksimum
mutate(min=min(tempo))%>% #membuat kolom minimum
select(album_name, max, min)%>%
unique()
dumbbell_tempo_peterpan <- plot_ly(peterpan_tempo, color = I("gray80"),
hoverinfo = 'text') %>%
add_segments(x = ~max, xend = ~min, y = ~album_name, yend = ~album_name, showlegend = FALSE) %>%
add_markers(x = ~max, y = ~album_name, name = "Maximum Tempo Value",color='red', text=~paste('Max Tempo: ', max)) %>%
add_markers(x = ~min, y = ~album_name, name = "Minimum Tempo Value",color='blue', text=~paste('Min Tempo: ', min))%>%
layout(
title = "Album Tempo Range",
xaxis = list(title = "Tempo"),
yaxis= list(title=""))
ggplotly(dumbbell_tempo_peterpan)
## Warning in RColorBrewer::brewer.pal(N, "Set2"): minimal value for n is 3, returning requested palette with 3 different levels
## Warning in RColorBrewer::brewer.pal(N, "Set2"): minimal value for n is 3, returning requested palette with 3 different levels
Untuk melihat bagaimana mood tiap lagu, dapat digunakan kombinasi dari valence dan energy
energy_by_valence_peterpan<-ggplot(peterpan,aes(x=valence,y=energy,color=album_name,text=paste(track_name,'-',album_name,'(',album_release_year,')')))+geom_point()+guides(fill=guide_legend(title="Album_Name"))
ggplotly(energy_by_valence_peterpan,tooltip=c("text"))
Terakhir, untuk merangkum karateristik audio tiap album, akan dibuat radar chart yang merepresentasikan setiap karaterisik audio
library(radarchart)
#Akan di agregat nilai mean dari tiap karateristik per albumnya
peterpan_album<-peterpan %>% group_by(album_name) %>% summarise(danceability=mean(danceability),
energy=mean(energy),
speechiness=mean(speechiness),
acousticness=mean(acousticness),
instrumentalness=mean(instrumentalness),
liveness=mean(liveness),
valence=mean(valence))
Dibutuhkan beberapa modifikasi pada dataframe, agar mendapatkan radar plot dengan setiap sumbu adalah karateristik audio. langkah yang dibutuhkan adalah men-transpose dataframe
peterpan_album.T<-t(peterpan_album[,2:ncol(peterpan_album)])
colnames(peterpan_album.T) <- peterpan_album$album_name
peterpan_album.T<-data.frame(peterpan_album.T)
peterpan_album.T<- cbind(rownames(peterpan_album.T),peterpan_album.T)
#visualisasi radar plot
chartJSRadar(peterpan_album.T)